package com.ejlchina.cashier;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;


/**
 * 支付类型
 * 
 * @author Troy.Zhou
 *
 */
public class PayType {

	/**
	 * 支付类型：快捷
	 */
	public static final String FAST_PAY_CODE = "fastpay";
	
	/**
	 * 支付类型：微信
	 */
	public static final String WX_PAY_CODE = "wx";
	
	/**
	 * 支付类型：支付宝
	 */
	public static final String ALI_PAY_CODE = "alipay";
	
	/**
	 * 支付类型
	 */
	private String payTypeCode;
	
	/**
	 * 费率
	 */
	private BigDecimal rate;
	
	/**
	 * 支付通道列表
	 */
	private List<Channel> channels;

	
	public PayType(String payTypeCode) {
		this.payTypeCode = payTypeCode;
	}
	
	/**
	 * 创建微信支付类型
	 * @param rate 费率
	 * @return 支付类型
	 */
	public static PayType createWxPayType(BigDecimal rate) {
		PayType payType = new PayType(WX_PAY_CODE);
		payType.rate = rate;
		return payType;
	}
	
	/**
	 * 创建支付宝支付类型
	 * @param rate 费率
	 * @return 支付类型
	 */
	public static PayType createAliPayType(BigDecimal rate) {
		PayType payType = new PayType(ALI_PAY_CODE);
		payType.rate = rate;
		return payType;
	}
	
	/**
	 * 创建快捷支付类型
	 * @return 支付类型
	 */
	public static PayType createFastPayType() {
		return new PayType(FAST_PAY_CODE);
	}
	
	/**
	 * 添加一个支付通道
	 * @param code 支付通道代码
	 * @param rate 支付通道费率
	 * @return 支付类型
	 */
	public PayType appendChannel(String code, BigDecimal rate) {
		if (isFastPay()) {
			if (code == null || rate == null) {
				throw new CashierException("code 和 rate 不能为 null"); 
			}
			if (channels == null) {
				channels = new ArrayList<>();
			}
			channels.add(new Channel(code, rate));
			return this;
		} else {
			throw new CashierException("非快捷类型不能添加Chanenl");
		}
	}
	
	/**
	 * 是否是快捷支付类型
	 * @return 是/否
	 */
	public boolean isFastPay() {
		return FAST_PAY_CODE.equals(payTypeCode);
	}

	public String getPayTypeCode() {
		return payTypeCode;
	}

	public BigDecimal getRate() {
		return rate;
	}

	public List<Channel> getChannels() {
		return channels;
	}

	/**
	 * 支付通道
	 * 
	 * @author Troy.Zhou
	 *
	 */
	public class Channel {

		/**
		 * 通道代码
		 */
		private String code;
		
		/**
		 * 通道费率
		 */
		private BigDecimal rate;

		public Channel(String code, BigDecimal rate) {
			this.code = code;
			this.rate = rate;
		}

		public String getCode() {
			return code;
		}

		public BigDecimal getRate() {
			return rate;
		}

	}
	
}
